/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include <stdlib.h>
#include <stdio.h>

#include "Dames_constantes.h"
#include "Dames_utilitaires.h"
#include "CSLP/CSLP.h"
#include "../constantes.h"
#include "../fonctions.h"

void Dames_IdentArray() {
	int nb;
	for(nb = 0; nb < DAMES_ARRAY_IDENT; nb++) {
		putchar(' ');
	}
}

void Dames_DisplayArray(const DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE]) {
	int x = 0, y = 0, i = 0;
	CSLP_COLORTYPE bg = 0, txt = 0;
	char charToPut = 0;
	DAMES_CASEVALUE caseValue = EMPTY;
	//identation des nombres au dessus du tableau
	Dames_IdentArray();
	CSLP_Color(RED | LIGHT, BLACK);
	printf("   1  2  3  4  5  6  7  8  9 10 \n");
	for(y = 0; y < 10; y++) {
		//Affichage de la ligne
		Dames_IdentArray();
		CSLP_Color(CT, BLACK);
		printf("%c ", y + 'A');
		for(x = 0; x < 10; x++) {
			charToPut = ' ';
			if(Dames_IsCaseBlancheXY(x, y)) {
				//affiche les cases blanches
				//Il n'y a jamais de pion sur
				//les cases blanches.
				if(array[x][y] & CURSOR)
					bg = YELLOW;
				else
					bg = WHITE;
				//charToPut = ' '; par défaut
			}
			else {
				caseValue = array[x][y];
				if(caseValue == EMPTY) {
					//charToPut = ' ';par défaut
					bg = RED;
				}
				else {
					if(caseValue & NOIR)
						txt = BLACK;
					else if(caseValue & BLANC)
						txt = WHITE | LIGHT;
					//modifie le caractère à
					//afficher
					//si on est sur la ligne
					//d'affichage.
					if(caseValue & DAME)
						charToPut = '@';
					else
						charToPut = 'O';

					if(caseValue & SRC)
						bg = BLUE | LIGHT;
					else if(caseValue & DEST)
						bg = GREEN | LIGHT;
					else if(caseValue & CURSOR)
						bg = YELLOW;
					else
						bg = RED;
				} //fin de else : if (caseValue == EMPTY)
			} //fin de else : if (y%2 == 0)
			CSLP_Color(txt, bg);
			printf(" %c ", charToPut);
		} //fin de for (x = 0; x < 10; x++)
		CSLP_ResetColors();
		putchar('\n');
	} //fin de for (y = 0; y < 10; y++)
}

void Dames_DisplayConsignes(DAMES_TURNSTEP step) {
	CSLP_ColorText(RED | LIGHT);
	switch(step) {
		case ERROR_SELECT:
			printf("Selection invalide. Veuillez s\x82lectionner l'un de vos pion.\n");
			step = SELECT;
			break;
		case ERROR_DEST:
			printf("Destination invalide. Veullez s\x82lectionner une case Rouge \x85 proximit\x82 de votre pion.\n");
			step = DESTINATION;
			break;
	}
	CSLP_ColorText(CT);
	switch(step) {
		case SELECT:
			printf("D\x82placez le curseur avec les touches directionnelles puis s\x82lectionnez votre pion avec 'Entrée'.\n");
			break;
		case DESTINATION:
			printf("S\x82lectionnez votre destination en d\x82plaçant le curseur avec les touches directionnelles. Ajoutez la destination en appuyant sur 'Espace'. Si vous avez termin\x82, appuyez sur 'Entrée'.\nVous pouvez annuler votre action en appuyant sur '<--' (Backspace)\n");
			break;
		case VALID:
			printf("Validez votre action en appuyant sur 'Entrée'\nOu annulez la en appuyant sur '<--' (Backspace)\n");
			break;
	}
}

void Dames_Display(const DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE], const char *currentPlayer, DAMES_TURNSTEP step, int nbTour) {
	AfficherTitre(DAMES_TITRE);
	putchar('\n');
	Dames_DisplayArray(array);
	putchar('\n');
	CSLP_ColorText(CT);
	printf("Tour n°%i.\n", nbTour);
	printf("Joueur ");
	CSLP_ColorText(RED | LIGHT);
	fputs(currentPlayer, stdout);
	CSLP_ColorText(CT);
	printf(", c'est à vous.\n");
	Dames_DisplayConsignes(step);
	CSLP_Color(CT, DEFAULT);
	putchar('\n');
}

void Dames_InitArray(DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE]) {
	int x = 0, y = 0;
	for(y = 0; y < DAMES_ARRAY_SIZE; y++) {
		for(x = 0; x < DAMES_ARRAY_SIZE; x++) {
			if(Dames_IsCaseBlancheXY(x, y)) {
				//case blanche donc vide
				array[x][y] = EMPTY;
			}
			else {
				//case noir
				if(y > 5) {
					//si on passe en dessous de la 6em
					//ligne, on passe dans le 'camp' des
					//blancs
					array[x][y] = BLANC;
				}
				else if(y < 4) {
					//tant qu'on ne passe pas en dessous
					//de la 4em ligne, on est dans le camps
					//des noir
					array[x][y] = NOIR;
				}
				else {
					//ligne 5 et 6: Nomansland
					array[x][y] = EMPTY;
				}
			}
		}
	}
}

void Dames_Deplacer(DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE], DAMES_CASEVALUE element, IPoint depart, IPoint arrivee) {
	Dames_Enlever(array, element, depart);
	Dames_Ajouter(array, element, arrivee);
}

void Dames_Enlever(DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE], DAMES_CASEVALUE element, IPoint lieu) {
	array[lieu.x][lieu.y] &= ~element;
}

void Dames_Ajouter(DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE], DAMES_CASEVALUE element, IPoint lieu) {
	array[lieu.x][lieu.y] |= element;
}

bool Dames_IsCaseBlancheIP(IPoint pt) {
	return Dames_IsCaseBlancheXY(pt.x, pt.y);
}

bool Dames_IsCaseBlancheXY(int x, int y) {
	bool retVal = false;
	if((x % 2 == 1 && y % 2 == 1) || (x % 2 == 0 && y % 2 == 0))
		retVal = true;
	return retVal;
}

DAMES_CASEVALUE Dames_GetCouleurPion(DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE], IPoint pt) {
	return array[pt.x][pt.y] &= (BLACK | WHITE);
}

DAMES_CASEVALUE Dames_GetPion(DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE], IPoint pt) {
	return array[pt.x][pt.y] &= (BLACK | WHITE | DAME);
}

void Dames_MoveCursor(DAMES_CASEVALUE array[DAMES_ARRAY_SIZE][DAMES_ARRAY_SIZE], IPoint *curseur, DIRECTION dir) {
	IPoint newCurseur = *curseur;
	switch(dir) {
		case HAUT:
			if(curseur->y > 0) {
				newCurseur.y--;
			}
			break;
		case BAS:
			if(curseur->y < DAMES_ARRAY_SIZE - 1) {
				newCurseur.y++;
			}
			break;
		case GAUCHE:
			if(curseur->x > 0) {
				newCurseur.x --;
			}
			break;
		case DROITE:
			if(curseur->x < DAMES_ARRAY_SIZE - 1) {
				newCurseur.x++;
			}
			break;
		default:
			return;
			break;
	}
	Dames_Deplacer(array, CURSOR, *curseur, newCurseur);
	*curseur = newCurseur;
}

